Initial exploratory data analysis of Asia-Pacific conflict trends
Author
Sean Ng
Published
July 30, 2024
Introduction
Conflict (including political unrest) in the Asia-Pacific is multifarious and interconnected. The gif below displays cumulative conflict events tracked by ACLED for the past 10 years.
Making sense of this data will require a deeper examination of the various contexts in this region and the ways in which they interact. Three major foci are observed – one around Afghanistan and Pakistan, one in the Philippines, and one in Myanmar and its border regions.
Below is a table comparing the the number of political conflict events and fatalities in the countries that ACLED has been monitoring since 2014. Conflict has decreased across these countries since 2014, with the notable exception of Myanmar.
Note that the following event sub-types have been filtered out for the data in this report: Agreement, Change to group/activity, Headquarters or base established.
10 years of conflict: comparison 2014 and 2023
country
events_2014
events_2023
events_diff%
fatalities_2014
fatalities_2023
fatalities_diff%
Myanmar
899
13232
1371.86
501
16060
3105.59
Nepal
250
2490
896.00
6
10
66.67
Sri Lanka
158
894
465.82
7
7
0.00
Bangladesh
1123
2693
139.80
391
337
-13.81
Pakistan
4201
8536
103.19
5419
2333
-56.95
Thailand
1304
608
-53.37
424
57
-86.56
Vietnam
47
17
-63.83
29
10
-65.52
Cambodia
270
90
-66.67
23
0
-100.00
As ACLED expanded the number of countries it monitored, a more comprehensive comparison is possible for the five-year horizon:
5 years of conflict: comparison 2019 and 2023
country
events_2019
events_2023
events_diff%
fatalities_2019
fatalities_2023
fatalities_diff%
Myanmar
1815
13232
629.04
1512
16060
962.17
Indonesia
1644
3570
117.15
210
214
1.90
North Korea
19
37
94.74
9
12
33.33
Iran
2602
4066
56.26
478
214
-55.23
Bangladesh
1738
2693
54.95
391
337
-13.81
Japan
1299
1792
37.95
0
0
0.00
South Korea
5493
6321
15.07
0
0
0.00
Pakistan
7686
8536
11.06
1157
2333
101.64
Thailand
568
608
7.04
174
57
-67.24
India
23672
22865
-3.41
1529
1213
-20.67
Sri Lanka
954
894
-6.29
304
7
-97.70
Mongolia
94
87
-7.45
0
0
0.00
Cambodia
98
90
-8.16
5
0
-100.00
Nepal
3242
2490
-23.20
49
10
-79.59
Malaysia
224
155
-30.80
15
0
-100.00
Philippines
1901
1251
-34.19
1706
855
-49.88
China
2516
1647
-34.54
13
9
-30.77
Vietnam
58
17
-70.69
1
10
900.00
Afghanistan
8373
1465
-82.50
23413
1125
-95.19
Hong Kong
1235
96
-92.23
1
0
-100.00
Similar to the 10-year comparisons, most countries in the region have seen decreases in both the number of events and the number of conflict-related fatalities. Of note are Myanmar and Pakistan for their increased fatalities and Indonesia, Iran and Bangladesh for their increase in political incidents.
The decreases in violence are apparent in most countries, as can be seen from the trendlines below; however, as we will explore in the next few sections, much more can be gained from country-based analyses.
Protests vs non-protests
Event type
Streamgraphs
Fatalities over time
From the chart below, sorted in order of number of fatalities from political incidents per quarter, it is clear that Afghanistan, Myanmar, Pakistan and Philippines have experienced severe political unrest, ranging from war, terrorism (with its hallmark explosions and remote violence) and political killings. Conflict in Afghanistan and Philippines has fallen significantly since its peak, but Myanmar is still in full conflagration and Pakistan is on the upswing:
It appears that Indonesia, Iran and Cambodia each have experienced much political violence leading up to elections, though in Cambodia, the deaths associated with protests in 2018 have served as a deterrent.
Events over time
The streamgraphs below show the number of political incidents per quarter broken down by event type, sorted in order by the number of political incidents.
It should be noted that in “stable” countries, the flavour of political conflict consists mainly of protests (which indicate widespread dissatisfaction but not that all nonviolent means have been exhausted).
Widespread dissatisfaction has manifested in Thailand in 2014 and in 2021. However, the Thai state has responded by firmly clamping down on its citizenry in both instances. Core issues have yet to be addressed and it is likely that unrest will flare up again. However, the share of protests compared to violent political incidents seems to be worsening, indicating that more actors (the state included) believe that non-violent means have been exhausted.
Bangladesh seems to have an outsized number of riots. Whilst protests are a natural feature of any democracy, riots are less so, given their disruptive and violent nature. Bangladesh seems to have a higher ratio of riots to protests than any other country except Papua New Guinea; this is not an esteemed group to be in, as it speaks to the inability of the state to maintain order and the ease of inciting the population (meaning that there are a multitude of injustices to inflame).
Political incidents in Bangladesh (as we will explore in later section) had been falling until they increased around 2018, around the time of the Rohingya genocide and the influx of 700,000 refugees into Cox’s Bazaar. This, predictably, has been destabilising for the country, bringing to light many longstanding issues and grudges.
Let’s take a closer look at some countries of interest and narrow down from a ten-year horizon to a five-year one:
Myanmar and Afghanistan bear all the patterns of war. But what is surprising is the extent to which Philippine civil society has deteriorated due to damage from the drug war and the resulting political violence. When compared to other countries, their share of protests is abysmally low, lower even than Cambodia. Even as the drug war operations ceased and killings began to drop off sharply, the flavour of political unrest in the Philippines seems deeply changed, with its participatory democracy suffering massive setbacks. This is after all, not only the country of the EDSA revolution, but of the dictator Marcos as well.
The Vietnamese state has seized the opportunity presented by COVID to advance state authority and clamp down on all types of political incidents (the clearest pattern of this in the region). China, for all the news of its vaunted lockdowns, only saw a more modest reduction in political incidents and is currently undergoing a mild increase in unrest related to labour and wage issues.
Indonesia is also experiencing an uptick in political incidents. The reasons behind this are to be explored.
In post-genocide Myanmar, with the longstanding civil war with ethnic and communal militias in the background, the population exploded in protests against the Tatmadaw’s coup. However, nonviolent means were soon exhausted and the country is now in full civil war.
With the victory of the Taliban, Afghanistan has seen a 96% reduction on conflict fatalities and a 83% drop in conflict events since 2019 levels. However, civil society has by no means recovered, nor does Afghanistan bear any of the hallmarks of a participatory democracy.
Per Capita
It makes sense to cluster the data – there seems to be a “repressive” cluster (China, Laos, North Korea, Singapore, Vietnam). We have “functioning democracies” of various stripes, at the bottom-left corner. We have war-torn countries – Myanmar and Afghanistan.
And finally, we have the “main sequence” running diagonally down the middle.
Afghanistan-Pakistan
The plots below show the past 5 years of conflict data in Afghanistan and Pakistan, with the border area between the two marked in a light grey.
The first three years show ultimately successful Taliban insurgency in full swing, with quite a significant amount of spillover into Pakistan, culminating in the US withdrawal in 2021. 2022 shows markedly less conflict, though we can see the beginnings of this “migration” of conflict (we don’t know how literal this is yet) from Afghanistan to Pakistan, this is more evident in 2023. This is in also line with the longstanding Taliban policy of disregard for the Durand Line.
Although ACLED only began data collection in Afghanistan in 2019, ACLED data on Pakistan was extracted all the way back to 2013. This is plotted below.
Immediately apparent is how comparable the levels of conflict in and outside of Pakistan’s border areas with Afghanistan are. This 100 km-thick strip of land only lags behind the rest of the country (including the capital) in the number of protests and strategic developments.
And, as observed from the maps above, we see an increase in political violence after the Taliban victory. As mentioned, this is in line with Taliban policy, but it remains to be explored how centrally-directed these efforts are.
Perhaps a more instructive view of violence in Pakistan’s border areas comes from an examination of conflict fatalities over time. Explosions and remote violence, battles and violence against civilians were once much more common in Pakistan’s border areas – this was likely dependent on the cycles of stabilisation and destabilisation in Afghanistan. This situation should be monitored for further deterioration since conflict is on the upswing.
Myanmar
Unlike in Afghanistan and Pakistan, cross-border conflict seems to be largely contained within Myanmar, likely because the militaries of the surrounding countries are much strong than the Tatmadaw as well as the prevalence of ethnic armed organisations in the border areas.
There are exceptions, firstly, Cox’s Bazaar, which seemed to have an elevated level of political violence even before the first military crackdown on the Rohingya. Admittedly, there had been Rohingya refugees in Cox’s Bazaar prior to the commencement of ACLED’s data collection.
Also Chiang Rai, though a cursory inspection of the data indicates political violence mostly driven by domestic issues, like the cyclical election violence in Thailand and calls for reform to the monarchy.
Within Myanmar itself, with reference to the maps below, the fighting seems to have come to a very strategic juncture. At first glance, the fighting seems to have lessened in 2024, but with reference to the line graph of monthly fatalities, we know that the fighting has instead been concentrated.
The reasons behind this are various. Firstly, for those not well-versed in the Myanmar civil war, the rebels and the National Unity Government have sought to isolate military garrisons from each other, giving to the very linear pattern of violence as both sides contest for control over the road network. The rebels do this to try and limit the military’s ability to project power into rebel-held terrain, with the final intention of pushing towards Naypyitaw, the gold diamond in the middle of the country maps below.
The plots below are of the Myanmar civil war, with events (red) plotted over the road network (blue). Gold squares are Tatamadaw regional commands and the blue squares are border crossings.
In the northeast, Lashio has fallen (and Muse has lost five out of ten border gates with China) and in the southeast Loikaw has fallen (not a major command post, but a city at a critical junction) and so has the crossing with Chiang Mai at Myawady. In the northwest, we see intensification of conflict in Rakhine in preparation for the battle of Sittwe. With the northern garrisons isolated and cut off, the main front moves towards the concurrent invasion of Mandalay.
The military no longer has the ability to push beyond the positions they already hold. If the rebels can defeat the Mandalay garrison, the Tatmadaw will have lost.
Bangladesh
Conflict in most parts of Bangladesh has been on the decline, with the notable exceptions of Dhaka and Cox’s Bazar (where the Rohingya fled).
Actors
Words
Source Code
---title: "Initial exploratory data analysis of Asia-Pacific conflict trends"author: "Sean Ng"date: "30 July 2024"toc: truetoc-location: lefttoc-depth: 4format: html: page-layout: full code-tools: true self-contained: true---```{r setup, include=FALSE}knitr::opts_chunk$set(echo = FALSE, warning = FALSE, message = FALSE, fig.width = 9.5)library(tidyverse)library(here)library(lubridate)library(patchwork)library(scales)library(sf)library(broom)library(treemapify)library(kableExtra) library(ggstream)`%out%` <- Negate(`%in%`)options(scipen = 100)theme_set(theme_light())show_col(viridis_pal(option = "cividis")(8))``````{r data, include=FALSE}country_list <- c("Afghanistan", "Bangladesh", "Bhutan", "Cambodia", "China", "Fiji", "Hong Kong", "India", "Indonesia", "Iran", "North Korea", "South Korea", "Laos", "Malaysia", "Maldives", "Mongolia", "Myanmar", "Nepal", "Pakistan", "Papua New Guinea", "Philippines", "Solomon Islands", "Sri Lanka", "Thailand", "Timor-Leste", "Vanuatu", "Vietnam")population <- read_csv(here("data", "wdi_all_countries_population.csv")) |> janitor::clean_names() %>% mutate(across(matches("_yr"), ~ as.numeric(.))) |> pivot_longer(cols = x2000_yr2000:x2023_yr2023, names_to = "year", values_to = "population") |> mutate(year = str_sub(year, start = -4, end = -1), year = as.double(year)) |> rename(country = country_name) |> mutate(country = case_when(str_detect(country, "Korea, Rep.") ~ "South Korea", str_detect(country, "Korea, Dem. People's Rep.") ~ "North Korea", str_detect(country, "Hong Kong SAR, China") ~ "Hong Kong", str_detect(country, "Iran, Islamic Rep.") ~ "Iran", str_detect(country, "Lao PDR") ~ "Laos", country == "Viet Nam" ~ "Vietnam", TRUE ~ country), country_iso = countrycode::countrycode(country, origin = "country.name", destination = "iso3c")) |> filter(!is.na(country) & country %out% c("Data from database: World Development Indicators", "Last Updated: 06/28/2024"))population_estimates <- crossing(country = population$country, year = 2000:2024) |> left_join(population |> select(year, country, population), by = c("year", "country")) |> group_by(country) %>% fill(population, .direction = "updown") world_shape <- st_read(here("data", "world-administrative-boundaries", "world-administrative-boundaries.shp"), quiet = TRUE)myanmar_adm1 <- st_read(here("data", "mmr_polbnda2_adm1_mimu_250k", "mmr_polbnda2_adm1_mimu_250k.shp"), quiet = TRUE) |> rename(state = ST, admin1_pcode = ST_PCODE) |> st_as_sf()country_iso3 <- world_shape |> distinct(name, iso3)acled_filtered <- readRDS(here("data", "acled_filtered.rds"))most_events_list <- acled_filtered |> filter(event_type != "Protest") |> group_by(country) |> summarise(events = n()) |> arrange(desc(events)) |> pull(country)most_fatalities_list <- acled_filtered |> group_by(country) |> mutate(fatalities = as.numeric(fatalities)) |> summarise(fatalities = sum(fatalities, na.rm = TRUE)) |> arrange(desc(fatalities)) |> pull(country)actor_codes_acled <- tribble( ~actor_code, ~description, 1, "State Forces", 2, "Rebel Groups", 3, "Political Militias", 4, "Identity Militias", 5, "Rioters", 6, "Protesters", 7, "Civilians", 8, "Other Forces")interaction_codes_acled <- read_csv(here("data", "interaction_codes_acled.csv"))afpak_buffer <- st_read(here("data", "afpak_buffer", "afpak_buffer.shp")) |> st_as_sf()afir_buffer <- st_read(here("data", "afir_buffer", "afir_buffer.shp")) |> st_as_sf()mmr_buffer <- st_read(here("data", "mmr_buffer", "mmr_buffer.shp"))acled_mmr <- readRDS(here("data", "acled_mmr.rds"))mmr_shape <- world_shape |> filter(str_detect(name, "Myanmar")) ```## IntroductionConflict (including political unrest) in the Asia-Pacific is multifarious and interconnected. The gif below displays cumulative conflict events tracked by ACLED for the past 10 years. Making sense of this data will require a deeper examination of the various contexts in this region and the ways in which they interact. Three major foci are observed -- one around Afghanistan and Pakistan, one in the Philippines, and one in Myanmar and its border regions. Below is a table comparing the the number of political conflict events and fatalities in the countries that ACLED has been monitoring since 2014. Conflict has decreased across these countries since 2014, with the notable exception of Myanmar.Note that the following event sub-types have been filtered out for the data in this report: `Agreement`, `Change to group/activity`, `Headquarters or base established`. <br>```{r}summary_stats <- acled_filtered |>group_by(country, year) |>summarise(events =n_distinct(event_id_cnty), fatalities =sum(fatalities, na.rm =TRUE), .groups ="drop")``````{r}event_diff_spec_2014 <- summary_stats |>select(-fatalities) |>filter(year %in%c(2014, 2023)) |>pivot_wider(names_from = year, values_from = events, names_prefix ="events_") |>filter(!is.na(events_2014)) |>mutate(event_diff_pc =round((events_2023 - events_2014) / events_2014 *100, digits =2)) |>filter(country !="Laos") |>mutate(country =fct_relevel(country, c("Myanmar", "Nepal", "Sri Lanka", "Bangladesh", "Pakistan", "Thailand", "Vietnam", "Cambodia"))) |>arrange(country)fatalities_diff_spec_2014 <- summary_stats |>select(-events) |>filter(year %in%c(2014, 2023)) |>pivot_wider(names_from = year,values_from = fatalities,names_prefix ="fatalities_") |>filter(!is.na(fatalities_2014)) |>mutate(fatalities_diff_pc =round((fatalities_2023 - fatalities_2014) / fatalities_2014 *100,digits =2)) |>mutate(fatalties_diff_pc =ifelse(is.nan(fatalities_diff_pc), 0, fatalities_diff_pc)) |>filter(country !="Laos") |>arrange(desc(fatalities_diff_pc))summary_stats |>select(-fatalities) |>filter(year %in%c(2014, 2023)) |>pivot_wider(names_from = year, values_from = events, names_prefix ="events_") |>filter(!is.na(events_2014)) |>mutate(event_diff_pc =round((events_2023 - events_2014) / events_2014 *100, digits =2)) |>left_join( summary_stats |>select(-events) |>filter(year %in%c(2014, 2023)) |>pivot_wider(names_from = year, values_from = fatalities, names_prefix ="fatalities_") |>filter(!is.na(fatalities_2014)) |>mutate(fatalities_diff_pc =round((fatalities_2023 - fatalities_2014) / fatalities_2014 *100, digits =2)) |>mutate(fatalties_diff_pc =ifelse(is.nan(fatalities_diff_pc), 0, fatalities_diff_pc)), by ="country" ) |>filter(country !="Laos") |>arrange(desc(event_diff_pc)) |>select(country, events_2014, events_2023, `events_diff%`= event_diff_pc, fatalities_2014, fatalities_2023, `fatalities_diff%`= fatalities_diff_pc) |>kable(caption ="10 years of conflict: comparison 2014 and 2023") |>kable_classic_2("striped", full_width =TRUE) |>column_spec(4, color ="grey50", background =spec_color(event_diff_spec_2014$event_diff_pc[1:8], direction =-1, end = .9, option ="magma")) |>column_spec(7, color ="grey30", background =spec_color(fatalities_diff_spec_2014$fatalities_diff_pc[1:8], direction =-1, end = .9, option ="magma")) ```<br>As ACLED expanded the number of countries it monitored, a more comprehensive comparison is possible for the five-year horizon: <br>```{r}event_diff_spec_2019 <- summary_stats |>select(-fatalities) |>filter(year %in%c(2019, 2023)) |>pivot_wider(names_from = year, values_from = events, names_prefix ="events_") |>filter(!is.na(events_2019)) |>mutate(event_diff_pc =round((events_2023 - events_2019) / events_2019 *100, digits =2)) |>filter(country !="Laos") |>arrange(desc(event_diff_pc)) fatalities_diff_spec_2019 <- summary_stats |>select(-events) |>filter(year %in%c(2019, 2023)) |>pivot_wider(names_from = year,values_from = fatalities,names_prefix ="fatalities_") |>filter(!is.na(fatalities_2019)) |>mutate(fatalities_diff_pc =round((fatalities_2023 - fatalities_2019) / fatalities_2019 *100,digits =2)) |>mutate(fatalities_diff_pc =ifelse(is.nan(fatalities_diff_pc), 0, fatalities_diff_pc), country =fct_relevel(country, event_diff_spec_2019 |>pull(country))) |>filter(country !="Laos") |>arrange(country)summary_stats |>select(-fatalities) |>filter(year %in%c(2019, 2023)) |>pivot_wider(names_from = year, values_from = events, names_prefix ="events_") |>filter(!is.na(events_2019)) |>mutate(event_diff_pc =round((events_2023 - events_2019) / events_2019 *100, digits =2)) |>left_join( summary_stats |>select(-events) |>filter(year %in%c(2019, 2023)) |>pivot_wider(names_from = year, values_from = fatalities, names_prefix ="fatalities_") |>filter(!is.na(fatalities_2019)) |>mutate(fatalities_diff_pc =round((fatalities_2023 - fatalities_2019) / fatalities_2019 *100, digits =2)) |>mutate(fatalities_diff_pc =ifelse(is.nan(fatalities_diff_pc), 0, fatalities_diff_pc)), by ="country" ) |>filter(country !="Laos") |>arrange(desc(event_diff_pc)) |>select(country, events_2019, events_2023, `events_diff%`= event_diff_pc, fatalities_2019, fatalities_2023, `fatalities_diff%`= fatalities_diff_pc) |>kable(caption ="5 years of conflict: comparison 2019 and 2023") |>kable_classic_2("striped", full_width =TRUE) |>column_spec(4, color ="grey30", background =spec_color(event_diff_spec_2019$event_diff_pc[1:19], direction =-1, end = .9, option ="magma")) |>column_spec(7, color ="grey30", background =spec_color(fatalities_diff_spec_2019$fatalities_diff_pc[1:19], direction =-1, end = .9, option ="magma"))```<br>Similar to the 10-year comparisons, most countries in the region have seen decreases in both the number of events and the number of conflict-related fatalities. Of note are Myanmar and Pakistan for their increased fatalities and Indonesia, Iran and Bangladesh for their increase in political incidents. The decreases in violence are apparent in most countries, as can be seen from the trendlines below; however, as we will explore in the next few sections, much more can be gained from country-based analyses. <br>```{r fig.height= 6.5}acled_filtered |> filter(year > 2013 & year <= 2025) |> filter(country %in% most_fatalities_list) |> group_by(country, year) |> summarise(fatalities = sum(fatalities, na.rm = TRUE), .groups = "drop") |> left_join(population_estimates, by = c("country", "year")) |> mutate(date = as.Date(paste(year, 1, 1, sep="-")), fatalities_100k = fatalities / population * 100000, country = fct_relevel(country, most_fatalities_list)) |> ggplot(aes(x = date, y = fatalities)) + geom_smooth(alpha = .1, colour = "salmon") + geom_line(aes(group = country)) + scale_x_date(date_labels = "%Y", date_breaks = "2 years") + facet_wrap(~ country, scales = "free_y") + scale_y_continuous(labels = comma) + theme(axis.text.x = element_text(angle = 60, hjust = 1), strip.background = element_rect(fill = "black")) + labs(title = "Political incident fatalities by country in descending order, 2014-2023", subtitle = "Black are the actual events, the trend line is in pink", y = "Annual fatalities", x = "")```### Protests vs non-protests ```{r fig.height=7}acled_filtered |> filter(year > 2013 & year <= 2025 & country != "Singapore") |> mutate(country = fct_relevel(country, most_events_list), protests = ifelse(str_detect(sub_event_type, "Protest|protest"), "protests", "non-protests"))|> mutate(quarter = floor_date(event_date, unit = "quarter")) |> group_by(country, quarter, protests) |> summarise(events = n(), fatalities = sum(fatalities), .groups = "drop") |> ggplot(aes(x = quarter, y = events, colour = protests)) + geom_smooth(aes(group = protests), se = FALSE) + scale_x_date(date_labels = "%Y", date_breaks = "2 years") + facet_wrap(~ country, scales = "free_y") + scale_y_continuous(labels = comma) + theme(axis.text.x = element_text(angle = 60, hjust = 1), strip.background = element_rect(fill = "black")) + labs(title = "Protests vs all other types of political conflict", y = "Number of events", x = "", colour = "") + theme(legend.position = "top", legend.margin=margin(c(1,5,5,5))) + guides(colour = guide_legend(nrow = 1))```<br><br><br>## Event type ### Streamgraphs```{r}event_stream_data <- acled_filtered |>filter(sub_event_type %out%c("Agreement", "Change to group/activity", "Headquarters or base established")) |>mutate(quarter =floor_date(event_date, unit ="quarter")) |>group_by(country, event_type, quarter) |>summarise(events =n_distinct(event_id_cnty), fatalities =sum(fatalities, na.rm =TRUE), .groups ="drop") event_type_streamgraph <-function(df, column_var) { column_var <-enquo(column_var) df |>ggplot(aes(x = quarter, y =!!column_var, fill = event_type)) +geom_stream(aes(fill = event_type)) +scale_fill_manual(values =c("Battles"="#7A0403FF","Violence against civilians"="#F05B12FF","Explosions/Remote violence"="#E1DD37FF","Protests"="#25ECA7FF","Strategic developments"="#30123BFF","Riots"="#3E9BFEFF" )) +facet_wrap(~ country, scales ="free_y") +labs(fill ="", x ="") +theme(legend.position ="top",legend.key.width =unit(.3, "cm"), legend.key.height =unit(.3, "cm"),legend.text =element_text(size =5), axis.text.y =element_text(size =4), axis.text.x =element_text(size =4, angle =30, hjust =1, vjust =1), strip.text =element_text(size =7), strip.background =element_rect(fill ="black"), plot.title =element_text(size =13), plot.subtitle =element_text(size =11)) +guides(fill =guide_legend(nrow =1))}```#### Fatalities over time From the chart below, sorted in order of number of **fatalities** from political incidents per quarter, it is clear that Afghanistan, Myanmar, Pakistan and Philippines have experienced severe political unrest, ranging from war, terrorism (with its hallmark explosions and remote violence) and political killings. Conflict in Afghanistan and Philippines has fallen significantly since its peak, but Myanmar is still in full conflagration and Pakistan is on the upswing: <br>```{r fig.height = 6.5}event_stream_data |> mutate(country = fct_relevel(country, most_fatalities_list)) |> filter(country %out% c("Australia", "Japan", "Mongolia", "New Zealand", "Vanuatu", "Timor-Leste")) |> filter(fatalities > 0) |> event_type_streamgraph(fatalities) + labs(title = "Number of fatalities by event type over time", subtitle = "Data from 2014-01-01 to 2024-05-31, but not countries had full coverage during this period", y = "Fatalities per quarter")```<br>It appears that Indonesia, Iran and Cambodia each have experienced much political violence leading up to elections, though in Cambodia, the deaths associated with protests in 2018 have served as a deterrent. <br><br>#### Events over timeThe streamgraphs below show the number of political incidents per quarter broken down by event type, sorted in order by the **number of political** incidents. It should be noted that in "stable" countries, the flavour of political conflict consists mainly of protests (which indicate widespread dissatisfaction but not that all nonviolent means have been exhausted). Widespread dissatisfaction has manifested in Thailand in 2014 and in 2021. However, the Thai state has responded by firmly clamping down on its citizenry in both instances. Core issues have yet to be addressed and it is likely that unrest will flare up again. However, the share of protests compared to violent political incidents seems to be worsening, indicating that more actors (the state included) believe that non-violent means have been exhausted. Bangladesh seems to have an outsized number of riots. Whilst protests are a natural feature of any democracy, riots are less so, given their disruptive and violent nature. Bangladesh seems to have a higher ratio of riots to protests than any other country except Papua New Guinea; this is not an esteemed group to be in, as it speaks to the inability of the state to maintain order and the ease of inciting the population (meaning that there are a multitude of injustices to inflame). Political incidents in Bangladesh (as we will explore in later section) had been falling until they increased around 2018, around the time of the Rohingya genocide and the influx of 700,000 refugees into Cox's Bazaar. This, predictably, has been destabilising for the country, bringing to light many longstanding issues and grudges. <br> ```{r fig.height = 6.5}event_stream_data |> mutate(country = fct_relevel(country, most_events_list)) |> filter(country %out% c("Bhutan")) |> event_type_streamgraph(events) + labs(title = "Number of political incidents by event type over time", y = "Events by quarter")```<br>Let's take a closer look at some countries of interest and narrow down from a ten-year horizon to a five-year one:Myanmar and Afghanistan bear all the patterns of war. But what is surprising is the extent to which Philippine civil society has deteriorated due to damage from the drug war and the resulting political violence. When compared to other countries, their share of protests is abysmally low, lower even than Cambodia. Even as the drug war operations ceased and killings began to drop off sharply, the flavour of political unrest in the Philippines seems deeply changed, with its participatory democracy suffering massive setbacks. This is after all, not only the country of the EDSA revolution, but of the dictator Marcos as well. <br>```{r fig.height = 6}event_stream_data |> mutate(country = fct_relevel(country, most_events_list)) |> filter(country %in% c("Myanmar", "Afghanistan", "Philippines", "China", "Indonesia", "Vietnam" ) & quarter >= "2019-01-01") |> event_type_streamgraph(events) + labs(title = "Number of political incidents by event type over time", subtitle = "Data from 2019-01-01 to 2024-05-31", y = "Events per quarter") + theme(legend.position = "top") ```<br>The Vietnamese state has seized the opportunity presented by COVID to advance state authority and clamp down on all types of political incidents (the clearest pattern of this in the region). China, for all the news of its vaunted lockdowns, only saw a more modest reduction in political incidents and is currently undergoing a mild increase in unrest related to labour and wage issues.Indonesia is also experiencing an uptick in political incidents. The reasons behind this are to be explored. In post-genocide Myanmar, with the longstanding civil war with ethnic and communal militias in the background, the population exploded in protests against the Tatmadaw's coup. However, nonviolent means were soon exhausted and the country is now in full civil war. With the victory of the Taliban, Afghanistan has seen a 96% reduction on conflict fatalities and a 83% drop in conflict events since 2019 levels. However, civil society has by no means recovered, nor does Afghanistan bear any of the hallmarks of a participatory democracy. <br><br><br>## Per Capita```{r}event_fatalities_pc <- event_stream_data |>mutate(year =year(quarter)) |>group_by(country, year) |>summarise(events =sum(events), fatalities =sum(fatalities), .groups ="drop") |>left_join( population_estimates, by =c("country", "year") ) |>mutate(events_100k = events / population *100000, fatalities_100k = fatalities / population *100000) |>group_by(country) |>summarise(events_100k =mean(events_100k), fatalities_100k =mean(fatalities_100k), events =sum(events), fatalities =sum(fatalities)) |>arrange(desc(events_100k))``````{r}event_fatalities_pc |>ggplot(aes(x = events_100k +0.01, y = fatalities_100k +0.01)) +geom_point(aes(colour = fatalities, size = events), alpha = .8) +# geom_text(aes(label = country), vjust = "inward") + ggrepel::geom_text_repel(aes(label = country), size =3, vjust ="inward") +scale_x_log10(breaks=c(0.01, 0.11, 1.01, 2.01, 5.01), labels=\(x) x-0.01) +scale_y_log10(breaks=c(0.01, 0.11, 1.01, 10.01), labels=\(x) x-0.01) +scale_size_continuous(range =c(.1, 6), trans ="log10") +scale_colour_viridis_c(option ="magma", direction =-1, end = .85) +labs(x ="Events per 100k", y ="Fatalities per 100k", title ="Events (magnitude) and fatalities (lethality) per 100,000 persons")```<br> It makes sense to cluster the data -- there seems to be a "repressive" cluster (China, Laos, North Korea, Singapore, Vietnam). We have "functioning democracies" of various stripes, at the bottom-left corner. We have war-torn countries -- Myanmar and Afghanistan. And finally, we have the "main sequence" running diagonally down the middle. ## Afghanistan-PakistanThe plots below show the past 5 years of conflict data in Afghanistan and Pakistan, with the border area between the two marked in a light grey.The first three years show ultimately successful Taliban insurgency in full swing, with quite a significant amount of spillover into Pakistan, culminating in the US withdrawal in 2021. 2022 shows markedly less conflict, though we can see the beginnings of this "migration" of conflict (we don't know how literal this is yet) from Afghanistan to Pakistan, this is more evident in 2023. This is in also line with the longstanding Taliban policy of disregard for the Durand Line. <br>```{r}afpak_map <-function(tbl){ tbl |>filter(!is.na(longitude) &!is.na(latitude) & country %in%c("Afghanistan", "Pakistan")) |>filter(sub_event_type %out%c("Agreement", "Change to group/activity", "Headquarters or base established", "Non-violent transfer of territory")) |>mutate(quarter =floor_date(event_date, "quarter")) %>%select(event_id_cnty, event_type, longitude, latitude, event_type, quarter, fatalities) |>ggplot() +geom_sf(data = world_shape, size = .7, colour ="gold", fill ="black") +geom_sf(data = afpak_buffer, colour ="black", fill ="white", alpha = .09) +coord_sf(xlim =c(60.41, 75.02), ylim =c(25.04, 39.11)) +geom_point(aes(x =73.0363, y =33.6995), colour ="cornflowerblue", pch =15) +geom_point(aes(x =69.2075, y =34.5553), colour ="cornflowerblue", pch =15) +geom_point(aes(x = longitude, y = latitude, colour = event_type, size = fatalities), alpha = .05) +theme(plot.background =element_rect(fill ="black", colour ="black"),panel.background =element_rect(fill ="black", colour ="black"),rect =element_rect(fill ="NA"),legend.text =element_text(colour ="white"), title =element_text(colour ="white"),legend.title =element_text(face ="bold"),plot.caption =element_text(hjust =0.2)) +guides(colour =guide_legend(override.aes =list(alpha =1)), size =guide_legend(override.aes =list(alpha =1, colour ="grey"))) +theme_void() +labs(colour ="", size ="Fatalities")}``````{r fig.height = 6.5, fig.width=9}acled_filtered |> filter(year == 2019) |> afpak_map() + scale_size_continuous(range = c(0.1, 3)) + labs(title = "2019") + # max100 theme(legend.position = "none") + acled_filtered |> filter(year == 2020) |> afpak_map() + scale_size_continuous(range = c(0.1, 2)) + labs(title = "2020") + #75 theme(legend.position = "none") + acled_filtered |> filter(year == 2021) |> afpak_map() + scale_size_continuous(range = c(0.1, 4)) + labs(title = "2021") + #150 theme(legend.text = element_text(size = 4), legend.title = element_text(size = 5), legend.key.width = unit(.3, "cm"), legend.key.height = unit(.3, "cm"), legend.margin=margin(t = 0, unit='cm')) +acled_filtered |> filter(year == 2022) |> afpak_map() + scale_size_continuous(range = c(0.1, 1.5)) + labs(title = "2022") + #60 theme(legend.position = "none") + acled_filtered |> filter(year == 2023) |> afpak_map() + scale_size_continuous(range = c(0.1, 2.2)) + labs(title = "2023") + #80 theme(legend.position = "none") + plot_layout(guides = "collect") + plot_annotation( title = "Political incidents in Afghanistan and Pakistan", subtitle = "Border areas (>100km) marked in light grey; country capitals in blue")```<br>Although ACLED only began data collection in Afghanistan in 2019, ACLED data on Pakistan was extracted all the way back to 2013. This is plotted below. Immediately apparent is how comparable the levels of conflict in and outside of Pakistan's border areas with Afghanistan are. This 100 km-thick strip of land only lags behind the rest of the country (including the capital) in the number of protests and strategic developments. <br>```{r}acled_afpak <- acled_filtered |>filter(!is.na(longitude) &!is.na(latitude) & country %in%c("Afghanistan", "Pakistan")) |>left_join(acled_filtered |>filter(!is.na(longitude) &!is.na(latitude) & country %in%c("Afghanistan", "Pakistan")) |>st_as_sf(coords =c("longitude", "latitude"), crs =4326) |>st_intersection(afpak_buffer) |>st_drop_geometry() |>mutate(afpak_border ="Afpak border") |>select(event_id_cnty, afpak_border), by ="event_id_cnty") |>mutate(afpak_border =ifelse(is.na(afpak_border), "Non-border", afpak_border))``````{r}acled_afpak |>filter(country =="Pakistan"& year !=2024) |>group_by(event_type, year =floor_date(event_date, "year"), afpak_border) |>summarise(events =n_distinct(event_id_cnty), .groups ="drop") |>ggplot(aes(x = year, y = events)) +geom_line(aes(colour = event_type)) +scale_y_log10(labels = comma) +scale_x_date(date_breaks ="2 years", date_labels ="%Y") +facet_wrap(~afpak_border) +theme(strip.background =element_rect(fill ="black")) +labs(colour ="Event type", x ="", y ="Number of political incidents",title ="Political incidents in Pakistan, by year and border area", subtitle ="Border area defined as 100km from Afghanistan")```<br>And, as observed from the maps above, we see an increase in political violence after the Taliban victory. As mentioned, this is in line with Taliban policy, but it remains to be explored how centrally-directed these efforts are. Perhaps a more instructive view of violence in Pakistan's border areas comes from an examination of conflict fatalities over time. Explosions and remote violence, battles and violence against civilians were once much more common in Pakistan's border areas -- this was likely dependent on the cycles of stabilisation and destabilisation in Afghanistan. This situation should be monitored for further deterioration since conflict is on the upswing. <br>```{r}acled_afpak |>filter(country =="Pakistan"& year !=2024) |>group_by(event_type, year =floor_date(event_date, "year"), afpak_border) |>summarise(fatalities =sum(fatalities, na.rm =TRUE), .groups ="drop") |>ggplot(aes(x = year, y = fatalities)) +geom_line(aes(colour = event_type)) +scale_y_continuous(labels = comma) +scale_x_date(date_breaks ="2 years", date_labels ="%Y") +facet_wrap(~afpak_border) +theme(strip.background =element_rect(fill ="black")) +labs(colour ="", x ="", y ="Number of fatalities",title ="Fatalities from political incidents in Pakistan, by year and border area", subtitle ="Border area defined as 100km from Afghanistan")```<br><br><br>## MyanmarUnlike in Afghanistan and Pakistan, cross-border conflict seems to be largely contained within Myanmar, likely because the militaries of the surrounding countries are much strong than the Tatmadaw as well as the prevalence of ethnic armed organisations in the border areas. There are exceptions, firstly, Cox's Bazaar, which seemed to have an elevated level of political violence even before the first military crackdown on the Rohingya. Admittedly, there had been Rohingya refugees in Cox's Bazaar prior to the commencement of ACLED's data collection. Also Chiang Rai, though a cursory inspection of the data indicates political violence mostly driven by domestic issues, like the cyclical election violence in Thailand and calls for reform to the monarchy. <br>```{r}acled_mmr |>mutate(pre_post_coup =case_when( event_date <"2016-10-09"~"Pre-Genocide", event_date >="2016-10-09"& event_date <"2021-02-01"~"Post-Genocide, pre-Coup", event_date >="2021-02-01"~"Post-Coup"), pre_post_coup =fct_relevel(pre_post_coup, c("Pre-Genocide", "Post-Genocide, pre-Coup", "Post-Coup"))) |>filter(event_type !="Peaceful protest") |>filter(country =="Myanmar"| mmr_border =="Myanmar border") |>ggplot() +geom_sf(data = mmr_shape, colour ="blue", alpha = .7, fill =NA) +geom_sf(data = mmr_buffer, alpha = .1, fill ="grey", colour =NA) +geom_point(aes(x = longitude, y = latitude, colour = event_type), size = .5, alpha = .2) +facet_wrap(~ pre_post_coup) +guides(colour =guide_legend(override.aes =list(alpha =1, size =2))) +labs(colour ="Event type") +theme(strip.background =element_rect(fill ="black"))```<br>Within Myanmar itself, with reference to the maps below, the fighting seems to have come to a very strategic juncture. At first glance, the fighting seems to have lessened in 2024, but with reference to the line graph of monthly fatalities, we know that the fighting has instead been concentrated. The reasons behind this are various. Firstly, for those not well-versed in the Myanmar civil war, the rebels and the National Unity Government have sought to isolate military garrisons from each other, giving to the very linear pattern of violence as both sides contest for control over the road network. The rebels do this to try and limit the military's ability to project power into rebel-held terrain, with the final intention of pushing towards Naypyitaw, the gold diamond in the middle of the country maps below. The plots below are of the Myanmar civil war, with events (red) plotted over the road network (blue). Gold squares are Tatamadaw regional commands and the blue squares are border crossings. <br><br>In the northeast, Lashio has fallen (and Muse has lost five out of ten border gates with China) and in the southeast Loikaw has fallen (not a major command post, but a city at a critical junction) and so has the crossing with Chiang Mai at Myawady. In the northwest, we see intensification of conflict in Rakhine in preparation for the battle of Sittwe. With the northern garrisons isolated and cut off, the main front moves towards the concurrent invasion of Mandalay.The military no longer has the ability to push beyond the positions they already hold. If the rebels can defeat the Mandalay garrison, the Tatmadaw will have lost. <br><br><br>## BangladeshConflict in most parts of Bangladesh has been on the decline, with the notable exceptions of Dhaka and Cox's Bazar (where the Rohingya fled). ```{r}bangladesh_admin2 <- acled_filtered |>filter(country =="Bangladesh") |>group_by(admin2) |>summarise(fatalities =sum(fatalities, na.rm =TRUE), events =n_distinct(event_id_cnty), .groups ="drop") |>arrange(desc(fatalities)) |>head(20) |>pull(admin2)``````{r}bangladesh_summary <- acled_filtered |>filter(country =="Bangladesh") |>mutate(quarter =floor_date(event_date, "quarter")) |>group_by(quarter, admin2) |>summarise(fatalities =sum(fatalities, na.rm =TRUE), events =n_distinct(event_id_cnty), .groups ="drop") |>pivot_longer(cols =c(fatalities, events), names_to ="type", values_to ="value") |>mutate(admin2 =fct_relevel(admin2, bangladesh_admin2), type =fct_rev(type)) bangladesh_summary |>filter(admin2 %in%c("Dhaka", "Chittagong", "Cox's Bazar", "Jessore")) |>ggplot(aes(x = quarter, y = value)) +geom_vline(aes(xintercept=as.numeric(quarter[c(145)])), linetype=4, colour="black", alpha = .5, size = .5) +geom_line(aes(colour = type)) +facet_wrap(~admin2, scales ="free_y") +scale_x_date(date_breaks ="2 years", label =date_format("%Y")) +theme(axis.text.x =element_text(size =5), strip.background =element_rect(fill ="black")) +labs(title ="Top 4 districts (admin2) in Bangladesh, political incidents and resulting fatalities", subtitle ="Grey line marks Rohingya genocide", y ="", x ="")``````{r}genocide_t_test <- bangladesh_summary |>mutate(rohingya =ifelse(quarter <"2017-08-25", "pre_genocide", "post_genocide")) |>filter(type =="fatalities") |>select(-type) |>group_by(admin2, rohingya) |>summarise(mean_value =mean(value, na.rm =TRUE), .groups ="drop") |>pivot_wider(values_from = mean_value, names_from = rohingya) %>%t.test(.$post_genocide, .$pre_genocide, data = .) |> broom::tidy()```## Actors ```{r fig.height=7, warning = FALSE}acled_actors <- rbind( acled_filtered |> select(actor = actor1, actor_code = inter1, event_id_cnty), acled_filtered |> select(actor = actor2, actor_code = inter2, event_id_cnty)) |> filter(!is.na(actor)) |> left_join(acled_filtered |> select(event_id_cnty, interaction, event_date, country, fatalities), by = c("event_id_cnty"), relationship = "many-to-many") |> mutate(event_date = as.Date(event_date, "%d %B %Y"), year = year(event_date), actor_code = as.double(actor_code)) |> left_join(actor_codes_acled |> rename(actor_description = description), by = "actor_code", relationship = "many-to-many") actor_order_list <- acled_actors |> mutate(quarter = floor_date(event_date, unit = "quarter")) |> group_by(country, quarter) |> summarise(actors = n_distinct(actor), .groups = "drop") |> group_by(country) |> summarise(actors = mean(actors)) |> arrange(desc(actors)) |> pull(country)acled_actors |> mutate(quarter = floor_date(event_date, unit = "quarter")) |> group_by(country, actor_description, quarter) |> summarise(actors = n_distinct(actor), fatalities = sum(fatalities, na.rm = TRUE), events = n_distinct(event_id_cnty), .groups = "drop") |> mutate(country = fct_relevel(country, actor_order_list), actor_description = fct_relevel(actor_description, c("Civilians", "State Forces", "Protesters", "Identity Militias", "Rebel Groups", "Rioters", "Political Militias", "Other Forces" ))) |> filter(country != "Singapore") |> ggplot(aes(x = quarter, y = actors, fill = actor_description)) + # geom_smooth(linewidth = .72, alpha = .7, se = FALSE, method = "loess") + geom_area() + scale_fill_manual( values = c( "Civilians" = "#D2E935FF", "State Forces" = "#7A0403FF", "Protesters" = "#4AC16DFF", "Identity Militias" = "#4777EFFF", "Rebel Groups" = "#FE9B2DFF", "Rioters" = "#1BD0D5FF", "Political Militias" = "#D3436EFF", "Other Forces" = "grey30")) + # scale_y_log10() + facet_wrap(~ country, scales = "free_y") + theme(legend.position = "top", legend.key.width = unit(.5, "cm"), legend.key.height = unit(.5, "cm"), legend.text = element_text(size = 7), axis.title.y = element_text(size = 7), axis.text.y = element_text(size = 7), axis.text.x = element_text(size = 7, angle = 30, hjust = 1, vjust = 1), strip.text = element_text(size = 12), strip.background = element_rect(fill = "black")) + guides(fill = guide_legend(nrow = 1, override.aes = list(linewidth = 2))) + labs(fill = "", title = "Number of active conflict actors by type", y = "")```<br><br><br>## Words